/*
* Copyright 2003-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.attributes.test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.Iterator;
import org.apache.commons.attributes.Attributes;
import org.apache.commons.attributes.AttributeIndex;
import org.apache.commons.attributes.test.samples.*;
import junit.framework.TestCase;
public class AttributesTestCase extends TestCase {
public void testClassAttributes () throws Exception {
/**
* @Dependency ( SampleService.class, "super-sample" )
*/
Class c = SuperSample.class;
assertEquals (1, Attributes.getAttributes (c).size ());
assertEquals (1, Attributes.getAttributes (c, Dependency.class).size ());
assertTrue (Attributes.hasAttributeType (c, Dependency.class));
assertTrue (Attributes.hasAttribute (c, new Dependency ( SampleService.class, "super-sample" )));
}
public void testMethodAttributes () throws Exception {
/**
* @Dependency ( SampleService.class, "super-some-method-sample" )
* @ThreadSafe ()
*/
Method m = SuperSample.class.getMethod ("someMethod", new Class[]{ Integer.TYPE });
assertEquals (2, Attributes.getAttributes (m).size ());
assertEquals (1, Attributes.getAttributes (m, Dependency.class).size ());
assertEquals (1, Attributes.getAttributes (m, ThreadSafe.class).size ());
assertTrue (Attributes.hasAttributeType (m, Dependency.class));
assertTrue (Attributes.hasAttributeType (m, ThreadSafe.class));
assertTrue (Attributes.hasAttribute (m, new Dependency ( SampleService.class, "super-some-method-sample" )));
assertTrue (Attributes.hasAttribute (m, new ThreadSafe ()));
}
public void testFieldAttributes () throws Exception {
/**
* @ThreadSafe ()
* @Dependency ( SampleService.class, "super-field" )
*/
Field f = SuperSample.class.getField ("field");
assertEquals (2, Attributes.getAttributes (f).size ());
assertEquals (1, Attributes.getAttributes (f, ThreadSafe.class).size ());
assertEquals (1, Attributes.getAttributes (f, Dependency.class).size ());
assertTrue (Attributes.hasAttribute (f, new ThreadSafe ()));
assertTrue (Attributes.hasAttribute (f, new Dependency ( SampleService.class, "super-field" ) ));
assertTrue (Attributes.hasAttributeType (f, ThreadSafe.class));
assertTrue (Attributes.hasAttributeType (f, Dependency.class));
}
public void testDefaultConstructorAttributes () throws Exception {
/**
* @Dependency ( SampleService.class, "sample-ctor1" )
*/
Constructor c = SuperSample.class.getDeclaredConstructor (new Class[0]);
assertEquals (1, Attributes.getAttributes (c).size ());
assertEquals (1, Attributes.getAttributes (c, Dependency.class).size ());
assertTrue (Attributes.hasAttributeType (c, Dependency.class));
assertTrue (Attributes.hasAttribute (c, new Dependency ( SampleService.class, "sample-ctor1" )));
}
public void testConstructorAttributes () throws Exception {
/**
* @Dependency ( SampleService.class, "sample-ctor2" )
*/
Constructor c = SuperSample.class.getDeclaredConstructor (new Class[]{ String.class, (new String[0][0]).getClass () } );
assertEquals (1, Attributes.getAttributes (c).size ());
assertEquals (1, Attributes.getAttributes (c, Dependency.class).size ());
assertTrue (Attributes.hasAttributeType (c, Dependency.class));
assertTrue (Attributes.hasAttribute (c, new Dependency ( SampleService.class, "sample-ctor2" )));
assertEquals (1, Attributes.getParameterAttributes (c, 1).size ());
assertEquals (1, Attributes.getParameterAttributes (c, 1, ThreadSafe.class).size ());
assertTrue (Attributes.hasParameterAttributeType (c, 1, ThreadSafe.class));
assertTrue (Attributes.hasParameterAttribute (c, 1, new ThreadSafe ()));
}
public void testParameterAndReturnAttributes () throws Exception {
Method m = Sample.class.getMethod ("methodWithAttributes", new Class[]{ Integer.TYPE, Integer.TYPE });
assertEquals (0, Attributes.getAttributes (m).size ());
assertEquals (2, Attributes.getReturnAttributes (m).size ());
assertTrue (Attributes.hasReturnAttribute (m, new Dependency ( SampleService.class, "sample-return" ) ));
assertTrue (Attributes.hasReturnAttribute (m, new Dependency ( SampleService.class, "sample-if-return" ) ));
assertEquals (0, Attributes.getParameterAttributes (m, 0).size ());
assertEquals (2, Attributes.getParameterAttributes (m, 1).size ());
assertTrue (Attributes.hasParameterAttribute (m, 1, new Dependency ( SampleService.class, "sample-if-param-2" ) ));
assertTrue (Attributes.hasParameterAttribute (m, 1, new ThreadSafe () ));
}
public void testNoAttributes () throws Exception {
Method m = Sample.class.getMethod ("methodWithNoAttributes", new Class[0]);
assertEquals (0, Attributes.getAttributes (m).size ());
}
/**
* Ensure that loading a class with the same name from two different class loaders
* won't mess up the attribute cache.
*/
public void testClassLoaderKeying () throws Exception {
URLClassLoader cl1 = new URLClassLoader (new URL[]{new File ("target/cl1/").toURL ()}, getClass().getClassLoader ());
URLClassLoader cl2 = new URLClassLoader (new URL[]{new File ("target/cl2/").toURL ()}, getClass().getClassLoader ());
Class cl1Class = cl1.loadClass ("TestClass");
Class cl2Class = cl2.loadClass ("TestClass");
assertEquals ("[[TestAttribute 1]]", Attributes.getAttributes (cl1Class).toString ());
assertEquals ("[[TestAttribute TestClass]]", Attributes.getAttributes (cl2Class).toString ());
}
public void testInnerClasses () throws Exception {
Class c = Sample.InnerSample.class;
assertEquals (1, Attributes.getAttributes (c).size ());
assertEquals (1, Attributes.getAttributes (c, Dependency.class).size ());
assertTrue (Attributes.hasAttributeType (c, Dependency.class));
assertTrue (Attributes.hasAttribute (c, new Dependency ( SampleService.class, "inner-sample" )));
}
public void testNamedParameters () throws Exception {
Method m = Sample.class.getMethod ("methodWithNamedParameters", new Class[]{ });
assertEquals (1, Attributes.getAttributes (m).size ());
assertEquals (1, Attributes.getAttributes (m, BeanAttribute.class).size ());
assertTrue (Attributes.hasAttributeType (m, BeanAttribute.class));
BeanAttribute ba = new BeanAttribute (1, "a");
ba.setName ("Smith, John \"Agent\"");
ba.setAnotherNumber (42);
assertTrue (Attributes.hasAttribute (m, ba));
}
}